package com.bitoon.basketdudes.web.admin;

import com.bitoon.basketdudes.web.xhr.*;
import com.bitoon.basketdudes.web.jpa.Torneo;
import com.bitoon.basketdudes.web.datos.InfoCabeceraXHR;
import com.bitoon.basketdudes.web.jpa.Calendario;
import java.util.*;
import javax.persistence.*;
import org.apache.log4j.Logger;

public class ListaTorneosUsuarioAdmin extends ListaTorneosUsuario{

    private Logger log = Logger.getLogger(ListaTorneosUsuarioAdmin.class);

    private Integer estado;

    //acceso a la clase estatica BaseActionAdmin
    protected BaseActionAdmin bsaadmin = BaseActionAdmin.getInstance();

    @Override
    public String execute() {

        try {
            if (getCadena() != null) {
                // Búsqueda por cadena - si esta vacia busca todos
                log.debug("Buscar torneos cadena: " + getCadena() + " estado: " + estado);
                buscarTorneosCadena(getCadena(),estado);
            } 

        } catch (Exception e) {
            log.error("Error", e);
        }

        return SUCCESS;
    }

    public String consultaXHR(){
        String retorno = SUCCESS;

        log.debug("[consultaXHR] listando...");

        buscarTorneosCadena(getCadena(),estado);

        return retorno;
    }

    private void buscarTorneosCadena(String cadena,Integer state) {
        List<Torneo> retorno = null;
        EntityManager em = null;

        try {
            retorno = new ArrayList<Torneo>();

            em = bsaadmin.getEmfAdmin().createEntityManager(); // checked
            Query qc = null;

            //si recibimos "todos" buscamos todos los torneos
            if(cadena.compareTo("todos")==0 || cadena.compareTo("")==0){
                log.debug("[buscarTorneosCadena] cadena todos");
                cadena="";
                setCadena("todos");
            }

            //si no pasan estado o quieren ver todos consultamos por cadena normal,sino
            //por estado y cadena
            if(state==null || state==0){
                log.debug("[buscarTorneosCadena] estado=0");
                qc = em.createNativeQuery("select * from basket.torneo where lower(nombre) like '%" + cadena + "%' order by nombre", Torneo.class);
            }else{
                qc = em.createNativeQuery("select * from basket.torneo where id in ( select torneo_id from basket.temporada where estado=" + state + ") and nombre like '%" + cadena + "%' order by nombre", Torneo.class);
            }
            int totalRegistros = 0;
            if (qc.getResultList()!=null) {
                totalRegistros = qc.getResultList().size();
            }
            int totalPaginas = (totalRegistros-1)/LISTADO_TORNEOS_ELEMENTOS_POR_PAGINA + 1;

            int offset = (getPagina()-1) * LISTADO_TORNEOS_ELEMENTOS_POR_PAGINA;
            
            Query q=null;
            if(state==null || state==0){
                q = em.createNativeQuery("select * from basket.torneo where lower(nombre) like '%" + cadena + "%' order by nombre", Torneo.class);
            }else{
                q = em.createNativeQuery("select * from basket.torneo where id in ( select torneo_id from basket.temporada where estado=" + state + ") and nombre like '%" + cadena + "%' order by nombre", Torneo.class);
            }
            q.setFirstResult((getPagina()-1)*LISTADO_TORNEOS_ELEMENTOS_POR_PAGINA);
            q.setFirstResult(offset);
            q.setMaxResults(LISTADO_TORNEOS_ELEMENTOS_POR_PAGINA);

            retorno = (List<Torneo>)q.getResultList();

            //Hibernate.initialize(retorno);

            log.debug("Total registros: " + totalRegistros);
            log.debug("Pagina: " + getPagina());
            log.debug("TotalPaginas: " + totalPaginas);

            setCabecera(new InfoCabeceraXHR());
            getCabecera().setCorrecto(1);
            getCabecera().setActual(getPagina());
            getCabecera().setTotal(totalPaginas);

            int p1=0, p2=0;

            if (getPagina() <= (LISTADO_TORNEOS_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_TORNEOS_HUECOS_LADO_PAGINA*2 + 1;
            } else if (getPagina() >= (totalPaginas-LISTADO_TORNEOS_HUECOS_LADO_PAGINA)) {
                p1 = totalPaginas - (LISTADO_TORNEOS_HUECOS_LADO_PAGINA*2);
                p2 = totalPaginas;
            } else {
                p1 = getPagina() - LISTADO_TORNEOS_HUECOS_LADO_PAGINA;
                p2 = getPagina() + LISTADO_TORNEOS_HUECOS_LADO_PAGINA;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            getCabecera().setPrimeraPagina(p1);
            getCabecera().setUltimaPagina(p2);
            getCabecera().setTotalRegistros(totalRegistros);

            setDatos(retorno);

        } catch (Exception e) {
            log.error("[buscaTorneosCadena]: Error: ", e);
        } finally {
            try { em.close(); } catch (Exception e) { }
        }
    }

    public List<Calendario> getCalendarioTemporadaActiva(int temporada_id){
        List<Calendario> retorno = null;
        EntityManager em = null;

        log.debug("[Calendario] temporada_id: " + temporada_id);

        try {
            retorno = new ArrayList<Calendario>();
            em = bsaadmin.getEmfAdmin().createEntityManager(); // checked
            Query qc = em.createNamedQuery("Calendario.findByTemporadaId");
            qc.setParameter("temporadaId", temporada_id);

            retorno = qc.getResultList();

        } catch (NoResultException nre) {
            log.debug("[getCalendarioTemporadaActiva] No se ha encontrado el calendario");
        } catch (Exception e) {
            log.error("[getCalendarioTemporadaActiva] Error: ", e);
        } finally {
            try { if (em.getTransaction().isActive()) { em.getTransaction().rollback();} }catch (Exception e) { }
            try { em.close(); } catch (Exception e) { log.error("Error: ", e); }
        }
        
        return retorno;
    }

    public Integer getEstado() {
        return estado;
    }

    public void setEstado(Integer estado) {
        this.estado = estado;
    }

    public BaseActionAdmin getBsaadmin() {
        return bsaadmin;
    }

    public void setBsaadmin(BaseActionAdmin bsaadmin) {
        this.bsaadmin = bsaadmin;
    }
}
